package com.tycmc.signelectroniccontracts.tools.net.tools;

import android.text.TextUtils;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created by Administrator on 2016/5/26.
 */
public class Json {
    /**
     * 对象转化Json输出
     * @param o
     * @return
     */
    public static String getJsonStr(Object o) {
        if(o instanceof Map){
            try {
                Map map = (Map) o;
                return getJson(map).toString();
            } catch (JSONException e) {
                e.printStackTrace();
                return o.toString();
            }
        }
        return o.toString();

    }

    /**
     * 将Map 转化成JSon
     * @param map
     * @return
     * @throws JSONException
     */
    private static JSONObject getJson(Map<String, Object> map) throws JSONException {
        Set<String> set = map.keySet();
        Iterator<String> iterator = set.iterator();
        JSONObject jsonObject = new JSONObject();
        while (iterator.hasNext()) {
            String next = iterator.next();
            if (map.get(next) instanceof List) {
                JSONArray jsonArray = new JSONArray();
                List<Map<String, Object>> list = (List) map.get(next);
                for (int i = 0; i < list.size(); i++) {
                    Map<String, Object> objectMap = list.get(i);
                    jsonArray.put(getJson(objectMap));
                }
                jsonObject.put(next, jsonArray);
            } else if (map.get(next) instanceof Map) {
                Map map1 = (Map) map.get(next);
                jsonObject.put(next, getJson(map1));
            } else {
                jsonObject.put(next, map.get(next));
            }
        }
        return jsonObject;
    }


    /**
     * @param object
     * @return
     * @throws JSONException
     */
    public static Map<String, Object> getMap(String object) throws JSONException {
        JSONObject json;
        if (TextUtils.isEmpty(object)) {
            json = new JSONObject();
        } else {
            json = new JSONObject(object);
        }
        return getMap(json);
    }

    /**
     * 由Json数据获取Map<String,Object>
     *
     * @param object
     * @return
     * @throws JSONException
     */
    public static Map<String, Object> getMap(JSONObject object) throws JSONException {
        Map<String, Object> objectMap = new HashMap<>();
        Iterator<String> keys = object.keys();
        while (keys.hasNext()) {
            String next = keys.next();
            Object o = object.get(next);
            if (o instanceof JSONArray) {
                JSONArray jsonArray = (JSONArray) o;
                List<Object> mapList = new ArrayList<>();
                for (int i = 0; i < jsonArray.length(); i++) {
                    try {
                        JSONObject jsonObject = jsonArray.getJSONObject(i);
                        mapList.add(getMap(jsonObject));
                    } catch (JSONException e) {
                        mapList.add(jsonArray.get(i).toString());
                    }
                }
                objectMap.put(next, mapList);
            } else if (o instanceof JSONObject) {
                JSONObject jsonObject = (JSONObject) o;
                objectMap.put(next, getMap(jsonObject));
            } else {
                objectMap.put(next, o);
            }
        }
        return objectMap;
    }

    /**
     * 获取json数组
     * @param object
     * @return
     * @throws JSONException
     */
    public static List<Map<String, Object>> getListJson(String object) throws JSONException {
        List<Map<String, Object>> list =new ArrayList<>();
        JSONArray jsonArray;
        if (TextUtils.isEmpty(object)) {
            jsonArray = new JSONArray();
        } else {
            jsonArray = new JSONArray(object);
        }
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            list.add(getMap(jsonObject));
        }
        return list;
    }
}
